// axios
// 1，创建一个axios
// 2，请求拦截器 如果有token就进行头部携带
// 3，响应拦截器 (1)剥离无效数据 (2) 处理token失效
// https://apipc-xiaotuxian-front.itheima.net/4，暴露出去
import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 创建axios
export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
// export const baseURL = 'https://apipc-xiaotuxian-front.itheima.net/'
const http = axios.create({
// 设置请求拦截器
  baseURL,
  timeout: 5000
})
// 设置请求拦截器
http.interceptors.request.use(config => {
  // 判断token是否在头部携带
  // 1，定义用户信息
  const { profile } = store.state.user
  // 2,判断头部是否携带token
  console.log(profile.token)
  if (profile.token) {
    // 设置token
    // 访问权限  Autnorzation意思是访问权限，Bearer是令牌的意思，意思就是访问权限为Bearer,不被允许的不可随意访问接口
    config.headers.Authorization = `Bearer ${profile.token}`
  }
  return config
}, err => {
// 请求失败
  return Promise.reject(err)
})
// 请求工具函数 , 暴露请求，就需要对请求函数进行修改来 传递参数
export default (url, method, submitData) => {
  return http({
    url,
    method,
    // 数据提交需要判断是不是get方式，如果是get方式，就为params，否则就为data，也就是  请求体传参
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
// 响应拦截器
http.interceptors.response.use(res => res.data, (err) => {
  // 1，清除无效的用户信息
  // 2，跳转到登录页
  // 3，跳转需要传参（当前路由地址）给登录页面
// 如果没有授权 err.response有响应并且响应状态码是401
  if (err.response && err.response.status === 401) {
    // Vuex持久化了，token存储在Vuex里面，把Vuex的里面变成一个空对象
    store.commit('user/setUser', {})
    // 传参  encodeURIComponent解码 ？后面的一串
    // js模块中要使用 router.currentRoute相当于$router fullPath是当前路由地址，router.currentRoute是一个ref响应式的
    const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
    // 跳转到登录页，传参
    router.push('/login?redirectUrl=' + fullPath)
  }
  return Promise.reject(err)
})

// 响应拦截器

// http.interceptors.use(res=>res.data,err=>{
//     // 错误的响应并且错误响应显示401
//     if(err.response && err.response.status === 401){
//         // 在未登录却加入购物车，
//         // 此时应该清空不必要的用户信息并且返回登录页面，并且获取到页面的路由地址
//         // 1，清空数据，也就是给他一个空对象，数据在Vuex中
//         store.commit('user/setUser',{})
//         // 2，跳转登录页面,解码，因为参数有特殊字符
//         const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
//         router.push('/login?redirect='+ fullPath)
//     }
// 返回一个promise拒绝的对象，参数为err
//     return Promise.reject(err)
// })
